package com.tianqicode.spring.beans.factory;

import com.tianqicode.spring.beans.BeansException;

/**
 * bean工厂顶层接口
 */
public interface BeanFactory {

    /**
     * 根据bean名称获取bean
     * @param name 要检索的 bean 的名称
     * @return bean实例
     * @throws BeansException
     */
    Object getBean(String name) throws BeansException;

    /**
     * 返回指定 bean 的一个实例，该实例可以是共享的，也可以是独立的。
     * 允许指定显式构造函数参数/工厂方法参数，覆盖 bean 定义中指定的默认参数（如果有）。
     * @param name 要检索的 bean 的名称
     * @param args 使用显式参数创建 bean 实例时使用的参数（仅在创建新实例时应用，而不是检索现有实例）
     * @return bean实例
     * @throws BeansException
     */
    Object getBean(String name, Object... args) throws BeansException;

    /**
     * @param name 要检索的 bean 的名称
     * @param requiredType bean 必须匹配的类型； 可以是接口或超类
     * @return
     * @throws BeansException
     */
    <T> T getBean(String name, Class<T> requiredType) throws BeansException;

    <T> T getBean(Class<T> requiredType) throws BeansException;
}
